package org.fly.utils;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.RandomStringUtils;

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;

/**
 * @author fly
 */

public class StrGenerator {

    public static String EncoderByMd5(String str) {
        return DigestUtils.md5Hex(str);
    }

    public static String generateRandomStr(int length) {
        return RandomStringUtils.randomAlphanumeric(length);
    }

    public static String encrypt(String password, String salt, int len) throws NoSuchAlgorithmException,
            InvalidKeySpecException {
        // 带有生成可变密钥大小的 PBE 密码的 PBEKey 时使用的一个密码、salt、迭代计数以及导出密钥长度的构造方法
        PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 1024, len);
        // 返回转换指定算法的密钥的secretKeyFactory 对象
        SecretKeyFactory kFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        // 根据提供的密钥规范（材料）生成secretKey接口
        SecretKey secretKey = kFactory.generateSecret(pbeKeySpec);
        // 返回基本编码格式的密钥 如果此密钥不支持编码，则返回 null
        byte[] buff = secretKey.getEncoded();
        return new String(buff);
    }
}
